這是我人生中解出的第二題逆向題目,雖然很簡單,但我也從中了解了解題的運作模式。
https://www.youtube.com/watch?v=wPDYgcxRuxo&t=119s

查看主函式 main() ,第 13 行
宣告了 3 個分別為 flag[] 、 key[] 、 input[]的字元陣列
查看第 22 行 enc(input, key)
查看void enc(char* str, char* key) ,第 4 行
傳址呼叫enc() 函式採用傳址呼叫,因此函式內對 str[] 、 key[] 的變動皆會影響 input[] 、key[]
查看 for()
str[i] 與 key[i % key_len] 進行 XOR 後存入 str[i]
key[i % key_len] 中 i % key_len ,是因為 key 的長度小於 flag,所以使用取餘數%的方式反覆循環 key[i] 的值查看第 24 ~ 37 行:
判斷使用者輸入的 input 是否與 flag 相同,若相同則 found ≠ 0,若不同則 found = 0
背景知識
二進位數字對同個二進位數字進行 2 次 XOR 後,會變成原來的二進位數字
應用
將 flag[] 再進行一次 XOR,即可還原成原始的 flag[]
解答
在程式最後面加上 enc(flag, key) ,並輸出 printf(%s, flag); 即可得到
Flag{Simple_C_Chall}